package com.zc.mychart.model;

import com.github.mikephil.charting.data.CandleEntry;
import com.github.mikephil.charting.data.Entry;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2018/2/27 0027.
 */

public class RSIEntrys {
    private List<Entry> RSI6s;
    private List<Entry> RSI12s;
    private List<Entry> RSI24s;

    public RSIEntrys(List<CandleEntry> list) {
        RSI6s = getRSIEntry(list, 6);
        RSI12s = getRSIEntry(list, 12);
        RSI24s = getRSIEntry(list, 24);
    }

    /**
     * RSI6一般是6日相对强弱指标
     * RSI12 一般是12日相对强弱指标
     * RSI24一般是24日相对强弱指标
     * 强弱指标的计算公式如下：
     * RSI=100×RS/(1+RS) 或者,RSI=100－100÷(1+RS)
     * RS=X天的平均上涨点数/X天的平均下跌点数
     * 其中 RS=14天内收市价上涨数之和的平均值/14天内收市价下跌数之和的平均值
     * 公式化简：RSI=100×14天内收市价上涨数之和的平均值÷(14天内收市价上涨数之和的平均值+14天内收市价下跌数之和的平均值）=100×14天内收市价上涨数之和÷(14天内收市价上涨数之和+14天内收市价下跌数之和）。
     * 举例说明：
     * 如果最近14天涨跌情形是：
     * 第一天升2元，第二天跌2元，第三至第五天各升3元；第六天跌4元 第七天升2元，第八天跌5元；第九天跌6元，第十至十二天各升1元；第十三至十四天各跌3元。
     * 那么，计算RSI的步骤如下：
     * （一）将14天上升的数目相加，除以14,上例中总共上升16元除以14得1.143（精确到小数点后三位)；
     * （二）将14天下跌的数目相加，除以14,上例中总共下跌23元除以14得1.643（精确到小数点后三位）；
     * （三）求出相对强度RS,即RS=1.143/1.643=0.696（精确到小数点后三位）；
     * （四）1+RS=1+0.696=1.696；
     * RS/(1+RS)=0.696/(1+0.696)=0.41038
     * （五)RSI=100*0.41028=41.038.
     * 结果14天的强弱指标RS1为41.038。
     * 公式简化后可得 RSI =  100*UP/(UP+DOWN)
     * 不同日期的14天RSI值当然是不同的，连接不同的点，即成RSI的轨迹。
     *
     * @param list
     * @param n
     * @return
     */
    private List<Entry> getRSIEntry(List<CandleEntry> list, int n) {
        List<Entry> entries = new ArrayList<>();
        if (list != null) {
            for (int i = n - 1; i < list.size(); i++) {
                float rsi;
                float upSum = 0;
                float downSum = 0;
                for (int j = i - n + 1; j <= i; j++) {
                    if (j > 0) {
                        float c = list.get(j).getClose() - list.get(j - 1).getClose();
                        if (c > 0) {
                            upSum += c;
                        } else {
                            downSum += c;
                        }
                    }
                }
                downSum = Math.abs(downSum);
                if (downSum != 0) {
                    rsi = 100 * upSum / (upSum + downSum);
                } else {
                    rsi = 100;
                }
                entries.add(new Entry(list.get(i).getX(), rsi));
            }
        }
        return entries;
    }

    public List<Entry> getRSI6s() {
        return RSI6s;
    }

    public List<Entry> getRSI12s() {
        return RSI12s;
    }

    public List<Entry> getRSI24s() {
        return RSI24s;
    }
}
